//Definicao da classe ListaDeReproducao.
package oxente;

import java.io.Serializable;
import java.util.*;
/**
 * Esta classe ListaDeReproducao caracteriza uma lista de reproducao de musicas.
 *@author Ivan Aguiar - 111210417 | Priscilla Barros - 110210113 | Renan Rodrigues - 110210615 | Samara Milena - 110210394
 *
 */
public class ListaDeReproducao implements Serializable {

	private static final long serialVersionUID = 1L;

	LinkedList<Musica> listaDeMusicas = new LinkedList<Musica>();

	String nomeDaLista = "";
	/**
	 * Construtor da classe ListaDeReproducao, com o argumento nome.
	 * @param nome Nome da lista.
	 * @throws Exception Lanca excecao caso o nome seja invalido.
	 */
	public ListaDeReproducao(String nome) throws Exception {
		if (nome == null || nome == "") {
			throw new Exception("Nome da lista eh nulo");
		}
		nomeDaLista = nome;
	}
	/**
	 * Adiciona musica na lista de musicas.
	 * @param musica Musica a ser adicionada.
	 * @return Boleean caso a musica tenha sido ou nao adicionada.
	 */
	public boolean adicionaMusica(Musica musica) {
		return listaDeMusicas.add(musica);
	}
	/**
	 * Obtem o nome da lista de reproducao.
	 * @return O nome da lista
	 */
	public String getNome() {
		return nomeDaLista;
	}
	
	/**
	 * Configura o nome da lista.
	 * @param nome Nome da lista de reproducao.
	 */
	public void setNome(String nome) {
		nomeDaLista = nome;
	}
	
	/**
	 * Elimina uma musica da lista.
	 * @param musica Musica a ser eliminada da lista.
	 * @return Boleean caso a musica tenha sido ou nao elimanada.
	 */
	public boolean eliminaMusica(Musica musica) {
		return listaDeMusicas.remove(musica);
	}
	
	/**
	 * Reproduz uma lista aleatoriamente.
	 * @return Uma String, com as musicas presentes na lista, aleatorias, ou uma mensagem indicando que nao ha musicas na lista
	 */
	public String reproduzirListaRandom() {
		if (listaDeMusicas.isEmpty())
			return "Lista esta vazia!";
				
		ArrayList<Musica> musicas = new ArrayList<Musica>();

		for (Musica msc : listaDeMusicas) {
			musicas.add(msc);
		}
		Collections.shuffle(musicas); 		
		
		String saida = "";
		for (int i = 0; i < musicas.size(); i++) {			
		
			String sd = musicas.get(i).reproduzir();
			saida += sd;
		}
		return saida;
	}
	/**
	 * Reproduz a lista em sequencia.
	 * @return Uma String, com as musicas presentes na lista, em sequencia, ou uma mensagem indicando que nao ha musicas na lista
	 */
	public String reproduzirListaEmSequencia() {
		String saida = "";
		if (listaDeMusicas.isEmpty())
			return "Lista esta vazia!";

		for (Musica musica : listaDeMusicas) {
			String msc = musica.reproduzir();
			saida += msc;
		}
		return saida;
	}
	
	/**
	 * Retorna uma LinkedList de Musica
	 * @return Uma LinkedList de Musica 
	 */
	public LinkedList<Musica> musicas() {
		return listaDeMusicas;
	}
	
	/**
	 * Busca por uma determinada musica.
	 * @param dados Dados da musuca buscada.
	 * @return Uma Musica com os respectivos dados.
	 * @throws Exception Lanca excecao caso os dados da musica sejam invalidos.
	 */
	public Musica retornaMusica(String dados) throws Exception {
		for (Musica msc : listaDeMusicas) {
			Musica musica = new Musica(dados);
			if (msc.equals(musica)) {
				return msc;
			}
		}

		return null;
	}
	
	/**
	 * Reproduz uma lista de acordo com a qualificacao de cada musica.
	 * @param grau 
	 * @return retorna uma String, com as musicas presentes na lista, de acordo com sua qualificacao, ou uma mensagem indicando que nao ha musicas na lista.
	 */
	public String reproduzirListaQualificada(int grau) {
		String saida = "";
		if (listaDeMusicas.isEmpty())
			return "Lista esta vazia!";

		for (Musica musica : listaDeMusicas) {
			if (musica.getQualificacao() >= grau) {
				String msc = musica.reproduzir();
				saida += msc;
			}
		}
		if (!saida.equals(""))
			return saida;
		else
			return "Nao ha musicas com essa qualificacao!";

	}
}

